import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:objectbox/objectbox.dart';

import '../objectbox.g.dart';

class ObjectBox {
  static late final Store _store;

  static Future<void> init() async {
    final directory = await getApplicationSupportDirectory();
    final storePath = p.join(directory.path, 'myrecorddb');
    _store = await openStore(directory: storePath);
  }

  static Store getStore() {
    return _store;
  }

  static Future<void> close() async {
    _store.close();
  }
}

/// 保存数据 使用示例 全局使用
/// var id = save(xxUser);
int saveOrUpdate<T>(T t) {
  var resId = ObjectBox.getStore().box<T>().put(t);
  return resId;
}

/// 删除数据 使用示例 全局使用
/// var isSuccess = delete<User>(id);
bool delete<T>(int id) {
  var box = ObjectBox.getStore().box<T>();
  var removeRes = box.remove(id);
  return removeRes;
}

/// 查询对应类型及ID的数据 使用示例 全局使用
/// var user = getById<User>(id);
T getById<T>(int id) {
  var box = ObjectBox.getStore().box<T>();
  return box.get(id) as T;
}

/// 查询对应类型的所有数据 使用示例 全局使用
/// var userList = getAll<User>();
List<T> getAll<T>() {
  var box = ObjectBox.getStore().box<T>();
  return box.getAll();
}

/**
 * 倒序查询数据
 */
List<T> getAllDesc<T>() {
  var box = ObjectBox.getStore().box<T>();
  final query = box // Query
      .query()
      .order(AudioRecordItem_.createTime as QueryProperty<T, dynamic>,
          flags: Order.descending) // 倒序
      .build();
  return query.find();
}

Future<List<T>> getAllAsync<T>() {
  var box = ObjectBox.getStore().box<T>();
  return box.getAllAsync();
}
